import axios from 'axios'
const iconv = require('iconv-lite');


const $http = axios.create({
  responseType: 'json',
  baseURL: '/api',
  timeout: 10000
});

// 默认配置项
const defaultConfig = {
  // 是否需要登陆
  auth: true,
  // 超时时间
  timeout: 10000,
  // 请求头
  contentType: 'application/json',
  // 跳过响应拦截器异常处理提示
  skipErrorMessage: false,
  // 跳过响应拦截器
  skipRespInterceptor: false
};

/**
 * get 请求
 * @param url
 * @param params
 * @param config
 * @returns {Promise<unknown>}
 */
const $get = (url, params = {}, config = {}) => {
  config.params = params;
  return new Promise((resolve, reject) => {
    $http.get(url, fillDefaultConfig(config))
      .then(res => resolve(res.data))
      .catch(res => reject(res))
  })
};

/**
 * post请求
 * @param url
 * @param data
 * @param config
 * @returns {Promise<unknown>}
 */
const $post = (url, data = {}, config = {}) => {
  return new Promise((resolve, reject) => {
    $http.post(url, data, fillDefaultConfig(config))
      .then(res => {
        resolve(res.data);
      })
      .catch(err => reject(err))
  })
};

/**
 * 设置默认配置项
 * @param config
 * @returns {*}
 */
function fillDefaultConfig(config) {
  if (!config) {
    return;
  }
  for (const defaultConfigKey in defaultConfig) {
    if (!(defaultConfigKey in config)) {
      config[defaultConfigKey] = defaultConfig[defaultConfigKey];
    }
  }
  return config;
}

// /**
//  * 配置请求拦截器
//  */
// $http.interceptors.request.use(
//   config => {
//     const loginToken = $storage.get($storage.keys.LOGIN_TOKEN);
//     config.headers['Content-Type'] = config.contentType;
//     config.headers[$storage.keys.LOGIN_TOKEN] = loginToken;   // 请求头设置token
//
//     return config;
//   }, error => {
//     return Promise.reject(error);
//   }
// );
//
//
//
// /**
//  * 配置响应拦截器
//  */
// $http.interceptors.response.use(resp => {
//   // 判断data
//   const respData = resp.data;
//   if (!respData || !respData.code) {
//     $message.warning('请求无效');
//     return Promise.reject(resp);
//   }
//
//   switch (respData.code) {
//     case 200:
//       // 正常返回
//       return respData;
//     case 401:
//       $message.warning('用户名或密码错误');
//   }
//
// });


/**
 * 上传文件
 * @param {*} url 
 * @param {*} formData 
 */
function uploadFile(url, formData) {
  return new Promise((resolve, reject) => {
      axios.post(url, formData, {
          headers: {
              'Content-Type': 'multipart/form-data'
          }
      }).then(response => {
          resolve(response)
      }).catch(error => {
          console.log("上传失败", error);
      })
  });
}

/**
*  下载文件
* @param {} url 
*/
function downloadFile(url, params) {
  return new Promise((resolve, reject) => {
      $http.get(url, {
        'responseType': 'blob',
        'params': params
      }).then(res => {
          let contentDisposition  = res.headers['content-disposition'];
          const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
          const result = patt.exec(contentDisposition)
          const filename = iconv.decode(result[1], 'utf-8') // 处理文件名,解决中文乱码问题 npm install iconv-lite
          let blob = new Blob([res.data], {type: 'application/octet-stream'});
          let url = window.URL.createObjectURL(blob);
          let a = document.createElement('a');
          a.href = url;
          a.download = filename.replace(new RegExp('"', 'g'), '');
          a.click();
          window.URL.revokeObjectURL(url);
          a.remove();
          resolve();
      })
  });
}


export default {
  $get,
  $post,
  uploadFile,
  downloadFile
}
